import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.undo.UndoManager;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.*;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
    ...................
    Created by HengyiYu
    
    Tanzhicong edited
    ...................
 */
class MyFrame extends JFrame {
    private static final int DEFAULT_WIDTH = 1024; // 窗口默认宽度
    private static final int DEFAULT_HEIGHT = 768; // 窗口默认高度
    private static final int DEFAULT_FONTSIZE = 20; // 默认字体大小
    private JTextArea tv_area = null; // 多行文本框
    private JScrollPane s_pane = null; // 带滚动条的面板
    private JMenuBar mb = null; // 菜单栏
    // private JToolBar toolBar1 = null; // 顶部工具栏
    private JToolBar toolBar2 = null; // 底部status栏
    private JMenu m_file = null; // 文件菜单
    private JMenu m_edit = null; // 编辑菜单
    private JMenu m_format = null; // 格式菜单
    private JMenu m_help = null; // 帮助菜单
    private JPopupMenu popupMenu = null; // 右键弹出式菜单
    private Icon toolBar_Save = null; // 工具栏保存图标
    private Icon toolBar_Cut = null; // 工具栏剪切图标
    private Icon toolBar_Copy = null; // 工具栏复制图标
    private Icon toolBar_Paste = null; // 工具栏粘贴图标
    private Icon statusBar_status = null; // 状态栏图标
    // private Icon toolBar_more_font = null; // 工具栏字体图标
    private Icon m_help_icon = null; // 关于菜单项图标
    private JFileChooser chooser = null; // 文件选择对象
    private File file = null; // 文件对象
    private UndoManager manager = null; // 撤销操作管理对象
    private String codestyle = "UTF-8"; // 编码格式

    /*----------------文件菜单项---------------------*/
    private JMenuItem file_new = null; // 新建
    private JMenuItem file_open = null; // 打开
    private JMenuItem file_save = null; // 保存

    private JMenuItem file_save_encrypt = null; // 加密后保存文件
    private JMenuItem file_open_decrypt = null; // 解密后打开文件

    private JMenuItem file_exit = null; // 退出
    /*----------------文件菜单项---------------------*/

    /*----------------编辑菜单项---------------------*/
    private JMenuItem edit_cut = null; // 剪切
    private JMenuItem edit_copy = null; // 复制
    private JMenuItem edit_paste = null; // 粘贴
    private JMenuItem edit_clear = null; // 清空当前内容
    private JMenuItem edit_undo = null; // 撤销
    /*----------------编辑菜单项---------------------*/

    /*----------------格式菜单项---------------------*/
    private JMenuItem format_chooseFontColor = null; // 选择字体颜色
    private JMenuItem format_chooseFont = null; // 选择字体
    /*----------------格式菜单项---------------------*/

    /*----------------帮助菜单项---------------------*/
    private JMenuItem help_about = null; // 关于
    /*----------------帮助菜单项---------------------*/

    /*----------------工具栏项目---------------------*/
    private JButton button_save = null;
    private JButton button_copy = null;
    private JButton button_paste = null;
    private JButton button_cut = null;
    // private JLabel moreOption = null;
    private JCheckBox check_bold = null; // 加粗选项
    private JCheckBox check_italic = null; // 斜体选项
    /*----------------工具栏项目---------------------*/

    /*----------------弹出菜单项---------------------*/
    private JMenuItem popCut = null;
    private JMenuItem popCopy = null;
    private JMenuItem popPaste = null;
    /*----------------弹出菜单项---------------------*/

    /*----------------状态栏项----------------------*/
    private JLabel label = null;
    private JLabel labelTime = null;
    private JLabel labelCodeStyle = null;
    /*----------------状态栏项----------------------*/

    public MyFrame(String title) {
        super(title); // 窗体标题
        init();
        registerListener();
    }

    // 初始化相关组件
    private void init() {
        tv_area = new JTextArea(); // 创建一个多行文本框
        tv_area.setFont(new Font("微软雅黑", Font.PLAIN, 18));
        tv_area.setCaretColor(Color.BLACK); // 光标颜色
        tv_area.setSelectedTextColor(Color.WHITE); // 选中字体颜色
        tv_area.setSelectionColor(Color.BLUE); // 选中背景颜色
        tv_area.setLineWrap(true); // 自动换行
        tv_area.setTabSize(4);
        tv_area.getDocument().addUndoableEditListener(manager); // 设置文本框编辑监听（可撤销）
        s_pane = new JScrollPane(tv_area, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); // 创建一个滚动条面板
        s_pane.setOpaque(false); // 设置面板透明
        s_pane.getViewport().setOpaque(false);
        mb = new JMenuBar(); // 初始化菜单栏
        manager = new UndoManager(); // 创建一个撤销管理对象
        Container cpan = this.getContentPane(); // 用Container对象获取当前框架的内容面板
        cpan.add(s_pane, BorderLayout.CENTER); // 将多行文本框添加到面板中央
        this.setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); // 设置窗体大小

        /*----------------设置图标----------------------*/
        // toolBar_Save = new ImageIcon("src/ToolBar_Save.png");
        // toolBar_Cut = new ImageIcon("src/ToolBar_Cut.png");
        // toolBar_Copy = new ImageIcon("src/ToolBar_Copy.png");
        // toolBar_Paste = new ImageIcon("src/ToolBar_Paste.png");
        // toolBar_more_font = new ImageIcon("src/more_font.png");
        // statusBar_status = new ImageIcon("src/statusBar.png");
        // m_help_icon = new ImageIcon("src/info.png");
        /*----------------设置图标----------------------*/

        /*----------------文件菜单----------------------*/
        m_file = new JMenu("文件(F)");
        m_file.setMnemonic('F');
        file_new = new JMenuItem("新建(N)");
        file_new.setAccelerator(KeyStroke.getKeyStroke("ctrl N"));
        file_new.setMnemonic('N');
        file_open = new JMenuItem("打开(O)");
        file_open.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));

        // 解密
        file_open_decrypt = new JMenuItem("打开加密的文本(D)");
        file_open_decrypt.setAccelerator(KeyStroke.getKeyStroke("ctrl D"));

        file_save = new JMenuItem("保存(S)");
        file_save.setEnabled(false);
        file_save.setAccelerator(KeyStroke.getKeyStroke("ctrl S"));

        // 加密
        file_save_encrypt = new JMenuItem("另存为加密文本(E)");
        file_save_encrypt.setEnabled(false);
        file_save_encrypt.setAccelerator(KeyStroke.getKeyStroke("ctrl E"));

        file_exit = new JMenuItem("退出");
        m_file.add(file_new);
        m_file.add(file_open);

        m_file.add(file_open_decrypt);

        m_file.add(file_save);

        m_file.add(file_save_encrypt);

        m_file.addSeparator();
        m_file.add(file_exit);
        /*----------------文件菜单----------------------*/

        /*----------------编辑菜单----------------------*/
        m_edit = new JMenu("编辑(E)");
        m_file.setMnemonic('E');
        edit_cut = new JMenuItem("剪切(X)");
        edit_cut.setEnabled(false);
        edit_cut.setAccelerator(KeyStroke.getKeyStroke("ctrl X"));
        edit_copy = new JMenuItem("复制(C)");
        edit_copy.setEnabled(false);
        edit_copy.setAccelerator(KeyStroke.getKeyStroke("ctrl C"));
        edit_paste = new JMenuItem("粘贴(V)");
        edit_paste.setAccelerator(KeyStroke.getKeyStroke("ctrl V"));
        edit_clear = new JMenuItem("清除");
        edit_clear.setEnabled(false);
        edit_undo = new JMenuItem("撤销(Z)");
        edit_undo.setAccelerator(KeyStroke.getKeyStroke("ctrl Z"));
        m_edit.add(edit_cut);
        m_edit.add(edit_copy);
        m_edit.add(edit_paste);
        m_edit.addSeparator();
        m_edit.add(edit_clear);
        m_edit.addSeparator();
        m_edit.add(edit_undo);
        /*----------------编辑菜单----------------------*/

        /*----------------格式菜单----------------------*/
        m_format = new JMenu("格式(M)");
        m_file.setMnemonic('M');
        format_chooseFont = new JMenuItem("字体选择");
        format_chooseFontColor = new JMenuItem("字体颜色");
        m_format.add(format_chooseFont);
        m_format.add(format_chooseFontColor);
        /*----------------格式菜单----------------------*/

        /*----------------帮助菜单----------------------*/
        m_help = new JMenu("帮助(H)");
        m_file.setMnemonic('H');
        help_about = new JMenuItem("关于", m_help_icon);
        m_help.add(help_about);
        /*----------------帮助菜单----------------------*/

        /*----------------右键菜单----------------------*/
        popupMenu = new JPopupMenu();
        popCut = new JMenuItem("剪切", toolBar_Cut);
        popCopy = new JMenuItem("复制", toolBar_Copy);
        popPaste = new JMenuItem("粘贴", toolBar_Paste);
        popupMenu.add(popCut);
        popupMenu.add(popCopy);
        popupMenu.add(popPaste);
        /*----------------右键菜单----------------------*/

        mb.add(m_file); // 菜单栏添加相应菜单file
        mb.add(m_edit); // 菜单栏添加相应菜单edit
        mb.add(m_format); // 菜单栏添加相应菜单format
        mb.add(m_help); // 菜单栏添加相应菜单help

        /*----------------工具栏-----------------------*/
        // toolBar1 = new JToolBar();
        // toolBar1.setMargin(new Insets(1,1,1,1));
        // 设置按钮间距
        button_save = new JButton(toolBar_Save);
        button_save.setEnabled(false);
        button_save.setToolTipText("保存当前内容");
        button_copy = new JButton(toolBar_Copy);
        button_copy.setEnabled(false);
        button_copy.setToolTipText("复制选中内容");
        button_paste = new JButton(toolBar_Paste);
        button_paste.setToolTipText("粘贴");
        button_cut = new JButton(toolBar_Cut);
        button_cut.setEnabled(false);
        button_cut.setToolTipText("剪切选中内容");
        // moreOption = new JLabel("更多-->",toolBar_more_font,SwingConstants.CENTER);
        check_bold = new JCheckBox("<html><p style=\"font-weight:bold;\">加粗</p><html>");
        check_bold.setEnabled(false);
        check_bold.setSelected(false);
        check_italic = new JCheckBox("<html><i>斜体</i></html>");
        check_italic.setEnabled(false);
        check_italic.setSelected(false);
        // toolBar1.addSeparator();
        // toolBar1.add(button_save);
        // toolBar1.addSeparator(new Dimension(20,2));
        // toolBar1.add(button_copy);
        // toolBar1.addSeparator(new Dimension(20,2));
        // toolBar1.add(button_paste);
        // toolBar1.addSeparator(new Dimension(20,2));
        // toolBar1.add(button_cut);
        // toolBar1.addSeparator(new Dimension(290,2));
        // toolBar1.add(moreOption);
        // toolBar1.add(check_bold);
        // toolBar1.add(check_italic);
        // toolBar1.setFloatable(false);

        /*----------------工具栏-----------------------*/

        /*----------------状态栏-----------------------*/
        toolBar2 = new JToolBar();
        toolBar2.setFloatable(false);

        // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        label = new JLabel("当前字数:0    英文字母个数:0    空格个数:0    汉字个数:0    标点符号个数:0    ", statusBar_status,
                SwingConstants.CENTER);
        // labelTime = new JLabel("日期: "+sdf.format(new Date()));
        // labelCodeStyle = new JLabel("编码: "+codestyle);

        toolBar2.add(label);
        // toolBar2.addSeparator(new Dimension(580,5));
        // toolBar2.add(labelTime);
        // toolBar2.addSeparator(new Dimension(180,5));
        // toolBar2.add(labelCodeStyle);
        /*----------------状态栏-----------------------*/

        // this.add(toolBar1,BorderLayout.NORTH); // 将工具栏添加到框架中
        this.add(toolBar2, BorderLayout.SOUTH);

        this.setJMenuBar(mb); // 将菜单栏添加到框架中
        this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        // 设置关闭时动作
        Toolkit kit = Toolkit.getDefaultToolkit(); // 获取工具包
        Dimension screenSize = kit.getScreenSize(); // Dimension对象获取尺寸
        int screenWidth = screenSize.width; // 获取当前屏幕宽度
        int screenHeight = screenSize.height; // 获取当前屏幕高度
        int windowsWidth = this.getWidth(); // 获取当前窗体宽度
        int windowsHeight = this.getHeight(); // 获取当前窗体高度
        this.setLocation((screenWidth - windowsWidth) / 2,
                (screenHeight - windowsHeight) / 2); // 设置窗口位置
        this.setVisible(true); // 设置窗体可见
    }

    // 监听器注册区
    private void registerListener() {
        tv_area.addMouseListener(new MouseAdapter() { // 为文本框添加鼠标监听器
            @Override
            public void mousePressed(MouseEvent e) {
                maybeShowPopup(e);
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                maybeShowPopup(e);
            }
        });

        tv_area.getDocument().addDocumentListener(new DocumentListener() {
            @Override // 监听文本区改变
            public void insertUpdate(DocumentEvent e) {
                isItemsAvalible(); // 一旦文本有改变就设置各按钮的可用性
                changeTextLengthStatus(); // 实时显示文本字数
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                isItemsAvalible(); // 一旦文本有改变就设置各按钮的可用性
                changeTextLengthStatus(); // 实时显示文本字数
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                changeTextLengthStatus(); // 实时显示文本字数
                isItemsAvalible(); // 一旦文本有改变就设置各按钮的可用性
            }
        });
        file_new.addActionListener(e -> newFile()); // 注册新建文件监听器
        file_open.addActionListener(e -> openFile()); // 注册打开文件监听器

        file_open_decrypt.addActionListener(e -> openFile_Decrypt()); // 注册解密文件监听器

        file_save.addActionListener(e -> saveFile()); // 注册保存文件监听器

        file_save_encrypt.addActionListener(e -> saveFile_Encrypt()); // 注册加密文件监听器

        file_exit.addActionListener(e -> exit()); // 注册退出程序监听器
        edit_clear.addActionListener(e -> clearAll());
        edit_undo.addActionListener(e -> undo());
        edit_cut.addActionListener(e -> tv_area.cut());
        edit_copy.addActionListener(e -> tv_area.copy());
        edit_paste.addActionListener(e -> tv_area.paste());
        format_chooseFont.addActionListener(e -> setTextFont());
        format_chooseFontColor.addActionListener(e -> setTextColor());
        help_about.addActionListener(e -> new AboutDialog(MyFrame.this,
                "About-NotePad", true));
        button_save.addActionListener(e -> saveFile());
        button_copy.addActionListener(e -> tv_area.copy());
        button_paste.addActionListener(e -> tv_area.paste());
        button_cut.addActionListener(e -> tv_area.cut());
        check_italic.addActionListener(e -> checkBox_setFont());
        check_bold.addActionListener(e -> checkBox_setFont());
        popCut.addActionListener(e -> tv_area.cut());
        popCopy.addActionListener(e -> tv_area.copy());
        popPaste.addActionListener(e -> tv_area.paste());
        this.addWindowListener(new WindowAdapter() { // 为框架添加退出保存的监视器
            @Override
            public void windowClosing(WindowEvent e) {
                String exitMessage = "保存该文本吗？";
                if (tv_area.getText().equals(""))
                    System.exit(0);
                else {
                    if (JOptionPane.showConfirmDialog(null, exitMessage, "提示",
                            JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
                        saveFile();
                        System.exit(0);
                    } else
                        System.exit(0);
                }
            }
        });
    }

    private void newFile() { // 新建文件触发函数
        if (!tv_area.getText().equals("")) {
            int res = JOptionPane.showConfirmDialog(null, "当前内容未保存，需要保存吗?",
                    "info", JOptionPane.YES_NO_OPTION); // 储存选择结果
            if (res == JOptionPane.YES_OPTION) {
                saveFile();
                tv_area.setText("");
                this.setTitle("untitled");
                file = null;
            } else {
                tv_area.setText(""); // 取消则清空页面
                this.setTitle("untitled");
                file = null;
            }
        }
    }

    private void clearAll() { // 清空当前页面触发函数
        tv_area.setText("");
    } // 清空页面触发函数

    private void openFile() { // 打开文件触发函数
        try {
            chooser = new JFileChooser();
            // 设置打开时的默认目录
            chooser.setFileFilter(new filter()); // 设置格式过滤器
            int result = chooser.showOpenDialog(null);
            if (result == JFileChooser.APPROVE_OPTION) { // 点击打开按钮
                file = chooser.getSelectedFile();
                int length = (int) file.length();
                FileReader reader = new FileReader(file);
                char[] ch = new char[length];
                reader.read(ch); // 将文件读进char数组
                reader.close();
                tv_area.setText(new String(ch).trim()); // 删除字符串的头尾空白符
                setTitle(file.getName()); // 框架标题设置为文件名
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
        }
    }

    private void openFile_Decrypt() { // 解密文件触发函数
        try {
            chooser = new JFileChooser();
            // 设置打开时的默认目录
            chooser.setFileFilter(new filter()); // 设置格式过滤器
            int result = chooser.showOpenDialog(null);
            if (result == JFileChooser.APPROVE_OPTION) { // 点击打开按钮
                file = chooser.getSelectedFile();
                int length = (int) file.length();
                FileReader reader = new FileReader(file);
                char[] ch = new char[length];
                reader.read(ch); // 将文件读进char数组
                reader.close();
                tv_area.setText(new String(ch).trim()); // 删除字符串的头尾空白符
                setTitle(file.getName()); // 框架标题设置为文件名
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
        }
    }

    private void saveFile() { // 文件保存触发函数
        if (file == null)
            try {
                chooser = new JFileChooser();
                chooser.setFileFilter(new filter());
                int result = chooser.showSaveDialog(null);
                if (result == JFileChooser.APPROVE_OPTION) {
                    File selectfile = chooser.getSelectedFile(); // 获得文件
                    String end = chooser.getFileFilter().getDescription();
                    // 获得被选中的过滤器中的文件扩展名
                    File newFile;
                    if (selectfile.getAbsolutePath().toUpperCase().endsWith(end.toUpperCase())) {
                        // 如果文件是以选定扩展名结束的，则使用原名
                        newFile = selectfile;
                    } else { // 否则加上选定的扩展名
                        newFile = new File(selectfile.getAbsolutePath() + end);
                    }
                    try {
                        if (!newFile.exists()) {
                            newFile.createNewFile();
                        }
                        FileWriter writer = new FileWriter(newFile);
                        char[] arry = tv_area.getText().toCharArray();
                        writer.write(arry);
                        writer.flush();
                        writer.close();
                        setTitle(newFile.getName());
                        file = newFile;
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e);
            }
        else
            try {
                FileWriter writer = new FileWriter(file);
                char[] arry = tv_area.getText().toCharArray();
                writer.write(arry);
                writer.flush();
                writer.close();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e);
            }
    }

    private void saveFile_Encrypt() { // 文件保存触发函数
        if (file == null)
            try {
                chooser = new JFileChooser();
                chooser.setFileFilter(new filter());
                int result = chooser.showSaveDialog(null);
                if (result == JFileChooser.APPROVE_OPTION) {
                    File selectfile = chooser.getSelectedFile(); // 获得文件
                    String end = chooser.getFileFilter().getDescription();
                    // 获得被选中的过滤器中的文件扩展名
                    File newFile;
                    if (selectfile.getAbsolutePath().toUpperCase().endsWith(end.toUpperCase())) {
                        // 如果文件是以选定扩展名结束的，则使用原名
                        newFile = selectfile;
                    } else { // 否则加上选定的扩展名
                        newFile = new File(selectfile.getAbsolutePath() + end);
                    }
                    try {
                        if (!newFile.exists()) {
                            newFile.createNewFile();
                        }
                        FileWriter writer = new FileWriter(newFile);
                        char[] arry = tv_area.getText().toCharArray();
                        writer.write(arry);
                        writer.flush();
                        writer.close();
                        setTitle(newFile.getName());
                        file = newFile;
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e);
            }
        else
            try {
                FileWriter writer = new FileWriter(file);
                char[] arry = tv_area.getText().toCharArray();
                writer.write(arry);
                writer.flush();
                writer.close();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e);
            }
    }

    private void undo() { // 撤销触发函数
        if (manager.canUndo()) {
            manager.undo();
        }
    }

    private void exit() { // 退出程序触发函数
        newFile();
        System.exit(0);
    }

    private void setTextFont() { // 选择字体触发函数
        try {
            GraphicsEnvironment ge = GraphicsEnvironment
                    .getLocalGraphicsEnvironment();
            // 获取系统字体
            JList<String> fontNames = new JList<>(ge.getAvailableFontFamilyNames());
            int response = JOptionPane.showConfirmDialog(null,
                    new JScrollPane(fontNames), "请选择字体 ( 默认: Courier Prime )",
                    JOptionPane.OK_CANCEL_OPTION);
            Object selectedFont = fontNames.getSelectedValue();
            if (response == JOptionPane.OK_OPTION && selectedFont != null)
                tv_area.setFont(new Font(fontNames.getSelectedValue(), Font.PLAIN, DEFAULT_FONTSIZE));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void setTextColor() { // 字体颜色选择触发函数
        Color color = JColorChooser.showDialog(null, "**请选择字体颜色**",
                Color.WHITE);
        tv_area.setForeground(color);
    }

    // 文件格式过滤
    private class filter extends javax.swing.filechooser.FileFilter {
        public boolean accept(File file) {
            String name = file.getName();
            name.toLowerCase();
            return name.endsWith(".txt") || file.isDirectory();
        }

        public String getDescription() {
            return ".txt";
        }
    }

    // 监视系统剪切板,暂时无用
    // private boolean isClipboardEmpty(){
    // Transferable transferable = Toolkit.getDefaultToolkit().
    // getSystemClipboard().getContents(null);
    // // 获取内容
    // if(transferable!=null &&
    // transferable.isDataFlavorSupported(DataFlavor.stringFlavor)){
    // try{
    // return false;
    // }catch (Exception e){
    // e.printStackTrace();
    // }
    // }
    // return true;
    // }

    private void maybeShowPopup(MouseEvent e) { // 监听鼠标
        if (e.isPopupTrigger()) {
            popupMenu.show(e.getComponent(), e.getX(), e.getY());
        }
    }

    private void changeTextLengthStatus() { // 文本监听
        String content = tv_area.getText(); // 总字数
        int enContent = 0; // 英文字母个数
        int blankContent = 0; // 空格个数
        int cnContent = 0; // 中文个数
        String Reg = "^[\u4e00-\u9fa5]{1}$"; // 正则，中文\u4e00-\u9fa5
        int dotContent = 0; // 标点符号
        for (int i = 0; i < content.length(); i++) {
            char c = content.charAt(i);
            String cn = Character.toString(content.charAt(i));
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                enContent++;
            } else if (c == ' ') {
                blankContent++;
            } else if (cn.matches(Reg)) {
                cnContent++;
            } else if (c >= '0' && c <= '9') {
                continue;
            } else {
                dotContent++;
            }
        }
        label.setText("当前字数:" + content.length() + "    " + "英文字母个数:" + enContent + "    " + "空格个数:" + blankContent
                + "    " + "汉字个数:" + cnContent + "    " + "标点符号个数:" + dotContent);
    }

    private void isItemsAvalible() { // 监视文本区并设置各功能项是否可用
        String content = tv_area.getText();
        if (content.equals("")) {
            edit_cut.setEnabled(false);
            edit_clear.setEnabled(false);
            edit_copy.setEnabled(false);
            file_save.setEnabled(false);
            file_save_encrypt.setEnabled(false);
            button_save.setEnabled(false);
            button_copy.setEnabled(false);
            button_cut.setEnabled(false);
            check_bold.setEnabled(false);
            check_italic.setEnabled(false);
        } else {
            file_save.setEnabled(true);
            file_save_encrypt.setEnabled(true);
            edit_cut.setEnabled(true);
            edit_clear.setEnabled(true);
            edit_copy.setEnabled(true);
            button_save.setEnabled(true);
            button_copy.setEnabled(true);
            button_cut.setEnabled(true);
            check_bold.setEnabled(true);
            check_italic.setEnabled(true);
        }
    }

    private void checkBox_setFont() { // 复选框监听
        if (check_bold.isSelected()) {
            check_italic.setEnabled(false);
            tv_area.setFont(new Font(tv_area.getFont().getName(), Font.BOLD, DEFAULT_FONTSIZE));
        }
        if (check_italic.isSelected()) {
            check_bold.setEnabled(false);
            tv_area.setFont(new Font(tv_area.getFont().getName(), Font.ITALIC, DEFAULT_FONTSIZE));
        }
        if (!check_bold.isSelected()) {
            check_italic.setEnabled(true);
            if (!check_italic.isSelected())
                tv_area.setFont(new Font(tv_area.getFont().getName(), Font.PLAIN, DEFAULT_FONTSIZE));
        }
        if (!check_italic.isSelected()) {
            check_bold.setEnabled(true);
            if (!check_bold.isSelected())
                tv_area.setFont(new Font(tv_area.getFont().getName(), Font.PLAIN, DEFAULT_FONTSIZE));
        }
    }
}